package br.ufrj.dcc.ad.args;

/**
 * Esse enum define todos os argumentos que serão extraídos
 * do main e que serão utilizados pela aplicação em geral.
 * Sempre que precisar de um argumento novo basta definir aqui.
 * @author wakim
 *
 */
public enum SimulationParameters {
	NUMBER_OF_ROUNDS("rounds", "r", Number.class, "10, 20, 30..."),//Número de iterações.
	ARRIVE_TAX("arrive.tax","arv.t",Number.class, "1.0, 2.0, 3.0..."),//Taxa de chegada poisson. (tempo entre chegadas exponencial)
	SERVER_TYPE("server.type","s.tp",String.class, "continuo, ncontinuo"),//Se o servidor é continuo ou não continuo.
	EXECUTION_TYPE("execution.type","exec.tp",String.class, "release, debug"),
	EXECUTION_TIME("execution.time","exec.tm",Number.class, "100000.0, 200000.0, 300000.0"),
	QUEUE1_TYPE("q1.type","q1.tp",String.class, "lifo, fifo, lifofifo"),//Tipo da fila 1.
	QUEUE2_TYPE("q2.type","q2.tp",String.class, "lifo, fifo, lifofifo"),//Tipo da fila 2.
	SERVICE1_TYPE("s1.type","s1.tp",String.class, "deterministico, exponencial, normal"),//Tipo de serviço da fila 1.
	SERVICE2_TYPE("s2.type","s2.tp",String.class, "deterministico, exponencial, normal"),//Tipo de serviço da fila 2.
	PERIOD1("q1.period","q1.p",Number.class, "1.0, 2.0, 3.0..."),//Período, para distribuição deterministica.
	PERIOD2("q2.period","q2.p",Number.class, "1.0, 2.0, 3.0..."),//Período, para distribuição deterministica.
	TAX1("q1.tax","q1.t",Number.class, "1.0, 2.0, 3.0..."),//Taxa, para distribuição exponencial.
	TAX2("q2.tax","q2.t",Number.class, "1.0, 2.0, 3.0..."),//Taxa, para distribuição exponencial.
	MEAN1("q1.mean","q1.m",Number.class, "1.0, 2.0, 3.0..."),//Média, para distribuição normal.
	MEAN2("q2.mean","q2.m",Number.class, "1.0, 2.0, 3.0..."),//Média, para distribuição normal.
	DP1("q1.desvioPadrao","q1.dp",Number.class, "1.0, 2.0, 3.0..."),//Desvio Padrao, para distribuição normal.
	DP2("q2.desvioPadrao","q2.dp",Number.class, "1.0, 2.0, 3.0..."),//Desvio Padrao, para distribuição normal.
	HELP("help", "h");
	
	private String canonicalName, alias, sample;
	/**
	 * Tipo do argumento aceito, é bom colocar apenas java.lang.Number
	 * ou java.lang.String
	 */
	private Class<?> klass;
	
	/**
	 * Exemplo:
	 * 	Argumento NUMBER_OF_ROUNDS:
	 * 		alias: -r
	 * 		canonicalName: --rounds
	 * Se o alias for usado entao o valor deve ser fornecido dessa forma: -r 10
	 * Se o canonical for usado entao o valor deve ser fornecido dessa forma: --rounds=10
	 */
	SimulationParameters(String canonicalName, String alias, Class<?> klass, String sample) {
		this.canonicalName = canonicalName;
		this.alias = alias;
		this.klass = klass;
		this.sample = sample;
	}
	
	private SimulationParameters(String canonicalName, String alias) {
		this(canonicalName, alias, null, null);
	}
	
	public String getCanonicalName() {
		return canonicalName;
	}
	
	public String getAlias() {
		return alias;
	}
	
	public Class<?> getType() {
		return klass;
	}
	
	@Override
	public String toString() {
		return canonicalName;
	}
	
	public String getSample() {
		return sample;
	}
}
